﻿#This module is a manipulator for table instances


#import os
#import sys




# Настройка вывода ошибок в файл

# Определяется текущая директория

#__dir__ = os.path.dirname(os.path.abspath(__file__))
#path_error = os.path.join(__dir__, "so_test_error.log")

# Вывод ошибок перенаправляется в файл error.log в текущей директории

#sys.stderr = open(path_error, 'a')

from dbnew import postgre, mysql, firebird, odbc, oracle

class FdbRelations:
	"This class is a manipulator for RDB$RELATIONS in firebird"
	#beginning of class suite
	#print (FdbRelations.__doc__)
	#Инициализация:
	def __init__(self):
		#Методу fdb присваивается экземпляр класса firebird
		self.fdb=firebird()
		self.log=None

	#Определяется базовая функция подсчета количества таблиц и видов
	def count(self,type,names):
		'''Function counts relations'''
		#beginning of function suite
		#print(self.count.__doc__)
		#Переменной query присваивается None
		query=''
		#Если аргумент names не равен ['']:
		if names!=['']:
			#Переменной query присваивается соответствующее условие sql запроса:
			query=" AND TRIM(RDB$RELATION_NAME) IN ('"+"','".join(names)+"')"
		#Выполняется подключение к базе данных
		self.fdb.connect()
		#Выполняется транзакция подсчета строк с заданными именами
		self.fdb.cursor.execute("SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE IN "+type+query)
		#Переменной result присваивается результат
		result=self.fdb.cursor.fetchall()[0][0]
		#Закрывается подключение к базе данных
		self.fdb.disconnect()
		#В переменную класса log записывается лог
		self.log='counted'
		#end of function suite
		#Функция возвращает число таблиц и видов с заданными именами
		return result
	
	#Определяется функция подсчета количества таблиц
	def CountTables(self,names=['']):
		'''Function counts tables'''
		#beginning of function suite
		#print(self.CountTables.__doc__)
		#end of function suite
		#Функция возвращает число таблиц с заданными именами
		return self.count('(0)',names)

	#Определяется функция подсчета количества видов
	def CountViews(self,names=['']):
		'''Function counts views'''
		#beginning of function suite
		#print(self.CountViews.__doc__)
		#end of function suite
		#Функция возвращает число видов с заданными именами
		return self.count('(1)',names)

	#Определяется функция подсчета количества таблиц и видов
	def CountAny(self,names=['']):
		'''Function counts any'''
		#beginning of function suite
		#print(self.CountAny.__doc__)
		#end of function suite
		#Функция возвращает число таблиц и видов с заданными именами
		return self.count('(0,1)',names)

	#Определяется базовая функция подсчета количества похожих таблиц и видов
	def countlike(self,type,names):
		'''Function counts like relations'''
		#beginning of function suite
		#print(self.CountViews.__doc__)
		#Переменной query присваивается None
		result=0
		#Выполняется подключение к базе данных
		self.fdb.connect()
		for name in names:
			#К значению переменной name добавляются %
			name='%'+name+'%'
			#Выполняется транзакция подсчета строк с заданным именем
			self.fdb.cursor.execute("SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE IN "+type+" AND TRIM(RDB$RELATION_NAME) LIKE ?",[name])
			#К переменной result прибавляется результат
			result=result+self.fdb.cursor.fetchall()[0][0]
		#Закрывается подключение к базе данных
		self.fdb.disconnect()
		#В переменную класса log записывается лог
		self.log='counted'
		#end of function suite
		#Функция возвращает число таблиц и видов с похожими именами
		return result

	#Определяется функция подсчета количества похожих таблиц
	def CountlikeTables(self,names=['']):
		'''Function counts tables'''
		#beginning of function suite
		#print(self.CountlikeTables.__doc__)
		#end of function suite
		#Функция возвращает число таблиц с похожим именами
		return self.countlike('(0)',names)

	#Определяется функция подсчета количества похожих видов
	def CountlikeViews(self,names=['']):
		'''Function counts views'''
		#beginning of function suite
		#print(self.CountlikeViews.__doc__)
		#end of function suite
		#Функция возвращает число видов с похожим именами
		return self.countlike('(1)',names)

	#Определяется функция подсчета количества похожих таблиц и видов
	def CountlikeAny(self,names=['']):
		'''Function counts any'''
		#beginning of function suite
		#print(self.CountlikeAny.__doc__)
		#end of function suite
		#Функция возвращает число таблиц и видов с похожим именами
		return self.countlike('(0,1)',names)

	#Определяется базовая функция выборки таблиц и видов
	def select(self,type,names):
		'''Function counts relations'''
		#beginning of function suite
		#print(self.CountViews.__doc__)
		#Переменной query присваивается None
		query=''
		#Если аргумент names не равен ['%']
		if names!=['']:
			#Переменной query присваивается соответствующее условие sql запроса:
			query=" AND TRIM(RDB$RELATION_NAME) IN ('"+"','".join(names)+"')"
		#Выполняется подключение к базе данных
		self.fdb.connect()
		#Выполняется транзакция подсчета строк с заданными именами
		self.fdb.cursor.execute("SELECT * FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE IN "+type+query)
		#Переменной result присваивается результат
		result=self.fdb.cursor.fetchall()
		#Закрывается подключение к базе данных
		self.fdb.disconnect()
		#В переменную класса log записывается лог
		self.log='selected'
		#end of function suite
		#Функция возвращает число таблиц и видов с заданными именами
		return result
		
	#Определяется функция выборки таблиц
	def SelectTables(self,names=['']):
		'''Function selects tables'''
		#beginning of function suite
		#print(self.SelectTables.__doc__)
		#end of function suite
		#Функция возвращает выборку таблиц с заданными именами
		return self.select('(0)',names)

	#Определяется функция выборки видов
	def SelectViews(self,names=['']):
		'''Function selects views'''
		#beginning of function suite
		#print(self.SelectViews.__doc__)
		#end of function suite
		#Функция возвращает выборку видов с заданными именами
		return self.select('(1)',names)
		
	#Определяется функция выборки таблиц и видов
	def SelectAny(self,names=['']):
		'''Function selects any'''
		#beginning of function suite
		#print(self.SelectAny.__doc__)
		#end of function suite
		#Функция возвращает выборку таблиц и видов с заданными именами
		return self.select('(0,1)',names)
	
	#Определяется базовая функция выборки похожих таблиц и видов
	def selectlike(self,type,names):
		'''Function selects like relations'''
		#beginning of function suite
		#print(self.selectlike.__doc__)
		#Переменной query присваивается None
		result=[]
		#Выполняется подключение к базе данных
		self.fdb.connect()
		for name in names:
			#К значению переменной name добавляются %
			name='%'+name+'%'
			#Выполняется транзакция подсчета строк с заданным именем
			self.fdb.cursor.execute("SELECT * FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE IN "+type+" AND TRIM(RDB$RELATION_NAME) LIKE ?",[name])
			#К переменной result прибавляется результат
			result=result+self.fdb.cursor.fetchall()
		#Закрывается подключение к базе данных
		self.fdb.disconnect()
		#В переменную класса log записывается лог
		self.log='selected'
		#end of function suite
		#Функция возвращает число видов и таблиц с похожими именами
		return result
		
	#Определяется функция выборки похожих таблиц
	def SelectlikeTables(self,names=['']):
		'''Function selects like tables'''
		#beginning of function suite
		#print(self.SelectlikeTables.__doc__)
		#end of function suite
		#Функция возвращает выборку таблиц с похожими именами
		return self.selectlike('(0)',names)

	#Определяется функция выборки похожих видов
	def SelectlikeViews(self,names=['']):
		'''Function selects like views'''
		#beginning of function suite
		#print(self.SelectlikeViews.__doc__)
		#end of function suite
		#Функция возвращает выборку видов с похожими именами
		return self.selectlike('(1)',names)
	
		#Определяется функция выборки похожих таблиц и видов
	def SelectlikeAny(self,names=['']):
		'''Function selects like any'''
		#beginning of function suite
		#print(self.SelectlikeAny.__doc__)
		#end of function suite
		#Функция возвращает выборку таблиц и видов с похожими именами
		return self.selectlike('(0,1)',names)
	
	#end of FdbRelations class suite

class FdbView:
	"This class is a base class to manipulate a view in firebird"
	#beginning of class suite
	#print (FdbView.__doc__)
	#Инициализация методов класса
	def __init__(self):
		self.fdb=firebird()
		self.FdbRelations=FdbRelations()
		self.log=None
		self.name=''
		self.fields=[]
		self.query=''
	
	def SqlName(self):
		"Function returns sql string for the view name"
		return 'X_OASUP_'+self.name
		
	def SqlFields(self):
		"Function returns sql string for the view fields"
		return ' '+'('+', '.join(self.fields)+')'
		
	def SqlCreate(self):
		"Function returns sql string for the view create query"
		return "CREATE VIEW "+self.SqlName()+self.SqlFields()+" AS "+self.query+";"
		
	def SqlDrop(self):
		"Function returns sql string for the view drop query"
		return "DROP VIEW "+self.SqlName()+";"
		
	def count(self):
		'''Function counts views with the name of the view'''
		#beginning of function suite
		#print(self.count.__doc__)
		#end of function suite
		#Функция возвращает результат выполнения функции self.FdbArticlesToImport.CountViews() с именем вида в качестве аргумента
		return self.FdbRelations.CountViews([self.SqlName()])
		
	def create(self):
		'''Function creates the view '''
		#beginning of function suite
		#print(FdbArticlesToImport.create.__doc__)
		#Подсчетывается количество видов с данным именем
		before=self.count()
		#Если количество=0
		if before==0:
			#Выполняется подключение к базе данных
			self.fdb.connect()
			# Выполняется запрос на создание вида в Firebird:
			self.fdb.cursor.execute(self.SqlCreate())
			#commit
			self.fdb.conn.commit()
			#Закрывается подключение к базе данных
			self.fdb.disconnect()
			#Подсчетывается количество видов с данным именем
			result=self.count()-before
			#В переменную класса log записывается лог
			self.log='created'
		else:
			#Переменной result присваивается нулевое значение
			result=0
			#В переменную класса log записывается лог
			self.log='exists'
		#end of function suite
		#Функция возвращает количество созданных видов
		return result

	def drop(self):
		'''Function drops the view'''
		#beginning of function suite
		#print(FdbArticlesToImport.drop.__doc__)
		#Подсчетывается количество видов с данным именем
		before=self.count()
		#Если количество не равно нулю:
		if before!=0:
			#Выполняется подключение к базе данных
			self.fdb.connect()
			# Выполняется запрос на удаление вида в Firebird:
			self.fdb.cursor.execute(self.SqlDrop())
			#commit
			self.fdb.conn.commit()
			#Закрывается подключение к базе данных
			self.fdb.disconnect()
			#Подсчетывается количество видов с данным именем
			result=before-self.count()
			self.log='droped'
		else:
			#Переменной result присваивается нулевое значение
			result=0
			#В переменную класса log записывается лог
			self.log='does not exist'
		#end of function suite
		#Функция возвращает количество уничтоженных видов
		return result

	#end of FdbView class suite

class ArticlesToImport(FdbView):
	"This class is a manipulator for articles to import in firebird"
	#beginning of class suite
	#print (FdbArticlesToImport.__doc__)
	def __init__(self):
		super(ArticlesToImport, self).__init__()
		self.name='ARTICLES_TO_IMPORT'
		self.fields=['art_id', 'section_id', 'sectname', 'doc_type', 'doc_name', 'designatio', 'name', 'note', 'mu_id', 'purchased', 'format', 'modifdate', 'version_id']
		self.query='''select 

DISTINCT 

a.art_id, a.section_id, ss.sectname, d.doc_type, e.doc_name, a.designatio, a.name, a.note, a.mu_id, a.purchased, d.format, a.modifdate, d.version_id

     FROM articles a, articles_view av, archives ar, pc, ssections ss, doclist d, doctypes e

          WHERE
               
               e.doc_type=d.doc_type
      
               AND d.doc_id=a.doc_id
               
               AND a.section_id=ss.section_id

               AND extract(YEAR from a.chkindate)>2005

               AND a.art_id>0

               AND ar.archive_id=av.archive_id

               AND (ar.archive_id=31
                        OR ar.archive_id=34
                        OR ar.archive_id=35
                        OR ar.archive_id=36
                        OR ar.archive_id=37
                        OR ar.archive_id=38
                        OR ar.archive_id=41
                        OR ar.archive_id=42
                        OR ar.archive_id=43)

               AND CHAR_LENGTH(TRIM(a.name))>0

               AND 

                (
                 (a.art_id=pc.part_aid
                  OR a.art_id=pc.proj_aid)

                 AND av.art_id=pc.proj_aid
                 AND CHAR_LENGTH(TRIM(a.designatio))>0
                 AND (a.SECTION_ID=1
                          OR a.SECTION_ID=3
                          OR a.SECTION_ID=4
                          OR a.SECTION_ID=8)
                )

UNION ALL

select 

DISTINCT 

a.art_id, a.section_id, ss.sectname, d.doc_type, e.doc_name, a.designatio, a.name, a.note, a.mu_id, a.purchased, d.format, a.modifdate, d.version_id

     FROM 

articles a, articles_view av, archives ar, pc, ssections ss, doclist d, doctypes e

          WHERE
               
               e.doc_type=d.doc_type
      
               AND d.doc_id=a.doc_id

               AND a.section_id=ss.section_id

               AND extract(YEAR from a.chkindate)>2005

               AND a.art_id>0

               AND ar.archive_id=av.archive_id

               AND (ar.archive_id=31
                        OR ar.archive_id=34
                        OR ar.archive_id=35
                        OR ar.archive_id=36
                        OR ar.archive_id=37
                        OR ar.archive_id=38
                        OR ar.archive_id=41
                        OR ar.archive_id=42
                        OR ar.archive_id=43)

               AND CHAR_LENGTH(TRIM(a.name))>0

               AND 
                
                (
                 a.art_id=pc.part_aid
                 AND av.art_id=pc.proj_aid
                 AND CHAR_LENGTH(TRIM(a.designatio))=0
                 AND (a.SECTION_ID=5
                          OR a.SECTION_ID=6
                          OR a.SECTION_ID=7)
                )'''


	#end of ArticlesToImport class suite

#*************************#

class PgArticles:
	"This class is a manipulator for articles in postgre"
	#print (PgArticles.__doc__)
	#beginning of class suite
	
	name='ei_so_search_articles'
	def create():
		'''Function creates the table'''
		#beginning of function suite
		#print(PgArticles.create.__doc__)
					
		name=PgArticles.name
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
		#Количество таблиц с именем таблицы присваивается переменной before
		before=count(name)[0][0]
		if before==0:
			#Выполняется транзакция создания таблицы
			create=db.postgre.conn.execute('''CREATE TABLE '''+name+''' 
						(
						  id serial NOT NULL, --id
						  art_id integer NOT NULL, --Search.articles
						  section_id integer NOT NULL, --Search.articles
						  sectname character varying(70) NOT NULL, --Search.ssections
						  doc_type integer NOT NULL, --Search.doclist
						  doc_name character varying(100) NOT NULL, --Search.doctypes
						  designatio character varying(80), --Search.articles
						  name character varying(250), --Search.articles
						  note character varying(252), --Search.articles
						  mu_id integer NOT NULL, --Search.articles
						  purchased character(1), --Search.articles
						  format character varying(200), --Search.doclist
						  modifdate timestamp, --Search.articles
						  version_id integer, --Search.doclist
						  prodcode integer, --Omega.konstrobj
						  CONSTRAINT '''+name+'''_pkey PRIMARY KEY (id)
						 );
						ALTER TABLE '''+name+''' OWNER TO openerp;
						COMMENT ON TABLE '''+name+''' IS 'Таблица артикулов Search';
						''')
		#Количество таблиц с именем таблицы присваивается переменной after
		after=count(name)[0][0]
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		return after-before

	def drop():
		'''Function drops the table'''
		#beginning of function suite
		#print(PgArticles.drop.__doc__)
					
		name=PgArticles.name
		#Выполняется подключение к базе данных postgres с заданными параметрами
		db.postgre.connect()
					
		#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
		#Количество таблиц с именем таблицы присваивается переменной before
		before=count(name)[0][0]
		if before!=0:
			#Удаляется таблица so_search_articles
			db.postgre.conn.execute('''DROP SEQUENCE '''+name+'''_id_seq CASCADE;
						  DROP TABLE '''+name+''';
						''')
		#Количество таблиц с именем таблицы присваивается переменной after
		after=count(name)[0][0]
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		return before-after
	
	def insert(art_id,version_id):
		'''Function inserts row in the table'''
		#beginning of function suite
		#print(PgArticles.insert.__doc__)
	
		destination=PgArticles.name
		source=FdbArticlesToImport.name
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Подготавливается транзакция подсчета количества строк таблицы 
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination+" WHERE art_id=$1 AND version_id=$2;")
		#Количество строк присваивается переменной before
		before=count(art_id,version_id)[0][0]
		result=['INSERT',0]
		if before==0:
			#Подготавливается транзакция вставки записи в таблицу ie_so_articles
			insert = db.postgre.conn.prepare("INSERT INTO "+destination+"(art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)")
			#Выполняется подключение к базе данных Firebird
			db.firebird.connect()
			#Выполняется запрос на выборку необходимых данных:
			db.firebird.cursor.execute("SELECT * FROM "+source+" WHERE art_id=? AND version_id=?", [art_id,version_id])
			#Данные из запроса выгружаются в переменную select
			select=db.firebird.cursor.fetchall()
			#Закрывается подключение к базе данных Firebird
			db.firebird.disconnect()
			#Если количество выбранных строк не равно нулю:
			if len(select)!=0:
				#Выполняется транзакция вставки строки в таблицу
				result=insert(select[0][0],select[0][1],select[0][2],select[0][3],select[0][4],select[0][5],select[0][6],select[0][7],select[0][8],select[0][9],select[0][10],select[0][11],select[0][12])
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число вставленных строк
		return result[1]
	
	
	def insert_many(rows):
		'''Function inserts row in the table'''
		#beginning of function suite
		#print(PgArticles.insert_many.__doc__)
		
		name=PgArticles.name
		#Подключение к базе данных
		db.postgre.connect()
		rows_true=[]
		artrevs=[]
		for row in rows:
			#Подготавливается транзакция выборки строки в таблице
			count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name+" WHERE art_id=$1 AND version_id=$2")
			if count(row[0],row[12])[0][0]==0 and (row[0],row[12]) not in artrevs:
				rows_true.append(row)
				artrevs.append((row[0],row[12]))
		#Подготавливается транзакция подсчета строк в таблице
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name)
		#Переменной before присваивается количество записей в таблице
		before=count()[0][0]
		#Подготавливается транзакция вставки строк в таблицу
		insert = db.postgre.conn.prepare("INSERT INTO "+name+"(art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)")
		#Выполняется транзакция вставки строк в таблицу
		insert.load_rows(rows)
		#Переменной after присваивается количество выбранных записей
		after=count()[0][0]
		#Закрывается подключение к базе данных
		db.postgre.disconnect()
		#end of function suite
		return after-before
					
	def update(id):
		'''Function updates row in the table'''
		#beginning of function suite
		#print(PgArticles.update.__doc__)
		destination=PgArticles.name
		source=FdbArticlesToImport.name
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Подготавливается транзакция обновления записи в таблице ie_so_articles
		update = db.postgre.conn.prepare("UPDATE "+destination+" SET section_id=$1, sectname=$2, doc_type=$3, doc_name=$4, designatio=$5, name=$6, note=$7, mu_id=$8, purchased=$9, format=$10, modifdate=$11, version_id=$12 WHERE id="+str(id))
		#Подготавливается транзакция выборки значений полей art_id, version_id для записи в таблице ie_so_articles с id=id
		select_pg = db.postgre.conn.prepare("SELECT art_id, version_id FROM "+destination+" WHERE id=$1")
		#Выполняется запрос на выборку из таблицы
		select_pg_result=select_pg(id)
		result=['UPDATE',0]
		if len(select_pg_result)==1:
			#Переменным art_id, version_id присваивается значение соответствующих полей для обновляемой записи в таблице
			art_id=select_pg_result[0].get(0)
			version_id=select_pg_result[0].get(1)
			#Выполняется подключение к базе данных Firebird
			db.firebird.connect()
			#Выполняется запрос на выборку необходимых данных из таблиц Firebird:
			db.firebird.cursor.execute("SELECT section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id FROM "+source+" WHERE art_id=? AND version_id=?", [art_id, version_id])
			#Из курсора извлекаются все строки в переменную result
			select_fdb_result=db.firebird.cursor.fetchall()
			#Закрывается подключение к базе данных Firebird
			db.firebird.disconnect()
			#Если данная ревизия данного артикула в Firebird имеется:
			if len(select_fdb_result)==1:
				#Выполняется транзакция обновления строки в таблице:
				result=update(select_fdb_result[0][0],select_fdb_result[0][1],select_fdb_result[0][2],
				select_fdb_result[0][3],select_fdb_result[0][4],select_fdb_result[0][5],
				select_fdb_result[0][6],select_fdb_result[0][7],select_fdb_result[0][8],
				select_fdb_result[0][9],select_fdb_result[0][10],select_fdb_result[0][11])
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число обновленных=извлеченных строк
		return result[1]
				
	def delete(id):
		'''Functions deletes row in the table'''
		#beginning of function suite
		#print(PgArticles.delete.__doc__)
		
		name=PgArticles.name
		#Подключение к базе данных postgre
		db.postgre.connect()
		#Подготавливается транзакция удаления строки в таблице X_OASUP_ARTICLES_IMPORT
		delete=db.postgre.conn.prepare("DELETE FROM "+name+" WHERE id=$1")
		#Выполняется транзакция
		result=delete(id)
		#Закрывается подключение к базе данных postgre
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число удаленных строк
		return result[1]
	
	def news_py():
		'''Function inserts new rows in the table from Firebird'''
		#beginning of function suite
		#print(PgArticles.news_py.__doc__)
		
		#Объявляются переменные названия таблиц
		destination=PgArticles.name
		source=FdbArticlesToImport.name
		#Объявляются переменные соответствующие количеству добавленных ревизий и артикулов
		_revisions=0
		_articles=0
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Выполняется подключение к базе данных Firebird
		db.firebird.connect()
		
		#Подготавливается транзакция подсчета строк в таблице
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
		#Переменной before присваивается количество записей в таблице
		before=count()[0][0]
		
		#Вставка новых ревизий
		
		#Подготавливается транзакция выборки строк из таблицы
		pg_articles_select = db.postgre.conn.prepare("SELECT art_id, version_id FROM "+destination)
		#В переменную pg_articles записывается результат запроса на выборку строк из таблицы
		pg_articles=pg_articles_select()
		
		#Для каждой строки в результате запроса на выборку из таблицы
		for row in pg_articles:
			#Выполняется запрос на выборку из вида Firebird to_import строк с таким же art_id, но другим version_id:
			db.firebird.cursor.execute("SELECT art_id, version_id FROM "+source+" WHERE art_id="+str(row.get(0))+" AND version_id!="+str(row.get(1)))
			#Результат выполнения запроса выгружаются в переменную res_new_rev
			fdb_articles_new_rev=db.firebird.cursor.fetchall()
			if len(fdb_articles_new_rev)==1:
				#Выполняется вставка артикула в postgre
				articles.pg.table.articles.insert(fdb_articles_new_rev[0].get(0),fdb_articles_new_rev[0].get(1))
				#Выполняется вставка соответствующего артикула в таблицу Firebird imported
				articles.fdb.table.imported.insert(fdb_articles_new_rev[0].get(0), fdb_articles_new_rev[0].get(1), 'revision', 'postgre', 'articles.pg.table.articles.news_py')
				#Количество добавленных ревизий увеличивается на число вставленных строк
				_revisions=_revisions+1
		
		#Создается пустой объект класса list
		art_ids=[]
		#Для каждой строки в результате запроса на выборку строк из таблицы в лист art_ids помещается значение поля art_id
		for row in pg_articles:
			art_ids.append(row[0])
		
		#Вставка новых артикулов
		
		#Выполняется запрос на выборку всех строк из вида Firebird to_import:
		db.firebird.cursor.execute("SELECT art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id FROM "+source)
		#Все строки результата выполнения запроса выгружаются в переменную result_all
		fdb_articles_all=db.firebird.cursor.fetchall()
		
		if len(fdb_articles_all)>0:
		
			#Для каждой строки в результате запроса на выборку всех строк из вида Firebird to_import
			for row in fdb_articles_all:
				#Если art_id в строке из запроса на выборку из вида Firebird to_import отсутствует в art_ids, 
				if row[0] not in art_ids:
					#Выполняется вставка соответствующего артикула в postgre
					articles.pg.table.articles.insert(row[0],row[12])
					#Выполняется вставка соответствующего артикула в таблицу Firebird imported
					articles.fdb.table.imported.insert(row[0], row[12], 'article', 'postgre', 'articles.pg.table.articles.news_py')
					#Количество добавленных артикулов увеличивается на число вставленных строк
					_articles=_articles+1
			
		#Закрывается подключение к базе данных Firebird
		db.firebird.disconnect()
		#Подготавливается транзакция подсчета строк в таблице
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
		#Переменной after присваивается количество записей в таблице
		after=count()[0][0]
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает list=[количество ревизий,количество артикулов]
		return [after-before,_revisions,_articles]

	def news():
		
		'''Function inserts new rows in the table from Firebird'''
		#beginning of function suite
		#print(articles.pg.table.articles.news_fdb.__doc__)
		
		#Объявляются переменные названия таблиц
		destination=PgArticles.name
		source=FdbArticlesToImport.name
		imported=articles.fdb.table.imported.name
		#Объявляются переменные соответствующие количеству добавленных ревизий и артикулов
		_revisions=0
		_articles=0

		#Выполняется подключение к базе данных Firebird
		db.firebird.connect()
		
		#Выполняется запрос на выборку из Firebird новых ревизий уже импортированных артикулов:
		db.firebird.cursor.execute("SELECT a.art_id, a.section_id, a.sectname, a.doc_type, a.doc_name, a.designatio, a.name, a.note, a.mu_id, a.purchased, a.format, a.modifdate, a.version_id FROM "+source+" a, "+imported+" b WHERE a.ART_ID=b.ART_ID AND a.VERSION_ID!=b.VERSION_ID")
		#Все строки результата выполнения запроса выгружаются в переменную result_all
		fdb_articles_new_rev=db.firebird.cursor.fetchall()
		_revisions=len(fdb_articles_new_rev)
		
		#Выполняется запрос на выборку из Firebird новых артикулов:
		db.firebird.cursor.execute("SELECT art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id FROM "+source+" WHERE ART_ID NOT IN (SELECT DISTINCT ART_ID FROM "+imported+")")
		#Все строки результата выполнения запроса выгружаются в переменную result_all
		fdb_articles_new_art=db.firebird.cursor.fetchall()
		_articles=len(fdb_articles_new_art)
		
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		
		#Подготавливается транзакция подсчета строк в таблице
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
		#Переменной before присваивается количество записей в таблице
		before=count()[0][0]
		
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		
		#Выполняется вставка новых ревизий из Firebird в postgre:
		articles.pg.table.articles.insert_many(fdb_articles_new_rev)
		
		#Создается пустой объект класса лист:
		rows=[]
		#Для каждой строки в результате выполнения запроса:
		for row in fdb_articles_new_rev:
			#В список rows добавляется строка
			rows.append(row[0], row[12], 'revision', 'postgre', 'articles.pg.table.articles.news_fdb')
		#Выполняется вставка строк в таблицу Firebird imported:
		articles.fdb.table.imported.insert_many(rows)
		
		#Выполняется транзакция вставки новых артикулов из Firebird в postgre:
		articles.pg.table.articles.insert_many(fdb_articles_new_art)
		
		#Создается пустой объект класса лист:
		rows=[]
		#Для каждой строки в результате выполнения запроса:
		for row in fdb_articles_new_art:
			#В список rows добавляется строка
			rows.append((row[0], row[12], 'article', 'postgre', 'articles.pg.table.articles.news_fdb'))
		#Выполняется вставка строк в таблицу Firebird imported:
		articles.fdb.table.imported.insert_many(rows)

		#Закрывается подключение к базе данных Firebird
		db.firebird.disconnect()

		#Выполняется подключение к базе данных postgres
		db.postgre.connect()

		#Подготавливается транзакция подсчета строк в таблице
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
		#Переменной after присваивается количество записей в таблице
		after=count()[0][0]

		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		
		#end of function suite
		#Функция возвращает list=[всего записей, из них ревизий, из них артикулов]
		return [after-before, _revisions,_articles]
		
	def empty():
		'''Function empties the table'''
		#beginning of function suite
		#print(articles.pg.table.articles.empty.__doc__)
		
		name=PgArticles.name
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Подготавливается запрос на удаление всех записей из таблицы
		delete=db.postgre.conn.prepare("DELETE FROM "+name)
		#Выполняется запрос на удаление записей из таблицы
		result=delete()
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число удаленных строк
		return result[1]


class OraKobjToImport:
	"This class is a manipulator for konstrobj to import view"
	#beginning of class suite
	#print (OraKobjToImport.__doc__)
	
	name='X_OASUP_SO_KOBJ_TO_IMPORT'
	
	def create():
		'''Function creates the view'''
		#beginning of function suite
		#print(OraKobjToImport.create.__doc__)
		
		name=OraKobjToImport.name
		#Выполняется подключение к базе данных Oracle
		db.oracle.connect()
		
		#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
		db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
		#Количество видов с именем вида присваивается переменной before
		before=db.oracle.cursor.fetchall()[0][0]
		if before==0:
		
			# Выполняется запрос на создание вида в Oracle:
			db.oracle.cursor.execute(''' CREATE OR REPLACE NOFORCE VIEW "OMP_ADM"."'''+name+'''" 

			("UNVCODE", "REVISION", "ITEMTYPE", "ITEMTYPE_NAME", "SIGN", "NAME", "NOTICE", "MEASCODE", "MEASNAME", "SUPPLYTYPE", "FORMAT", "OWNER", "OWNER_NAME", "RECDATE", "PRODCODE", "OMP_OBJECTS_CODE", "FIRST_PROMCODE", "LAST_PROMCODE", "CURRENT_STATE", "STATEDATE", "LASTNAME") 
					
					AS 
					
					SELECT a.UNVCODE, a.REVISION, a.ITEMTYPE, b."NAME" AS "ITEMTYPE_NAME", a.SIGN,
a."NAME", a.NOTICE, a.MEASCODE, c."NAME" as MEASNAME, a.SUPPLYTYPE, a.FORMAT, 
a.OWNER, d."NAME" as "OWNER_NAME", a.RECDATE, a.PRODCODE, e.CODE as "OMP_OBJECTS_CODE",
g.CODE as "FIRST_PROMCODE", h.CODE as "LAST_PROMCODE", i.CURRENT_STATE, i.STATEDATE, i.LASTNAME


FROM OMP_ADM.KONSTROBJ a, OMP_ADM.KO_TYPES b, 
    OMP_ADM.MEASURES c, OMP_ADM.OWNER_NAME d,
    OMP_ADM.BUSINESS_OBJECTS e,
    
    (SELECT a.DOCCODE as "UNVCODE", MIN(b.CODE) AS "CODE"
        FROM OMP_ADM.BUSINESS_OBJECTS a, OMP_ADM.BUSINESSOBJ_PROMOTION b, OMP_ADM.BUSINESSOBJ_STATES c
            WHERE b.BUSINESSOBJ=a.CODE
                AND c.CODE=b.CURRENT_STATE
                AND a."TYPE" IN (0,1,2,3,4,5,6,22)
        GROUP BY a.DOCCODE) g,

    (SELECT a.DOCCODE as "UNVCODE", MAX(b.CODE) AS "CODE"
        FROM OMP_ADM.BUSINESS_OBJECTS a, OMP_ADM.BUSINESSOBJ_PROMOTION b, OMP_ADM.BUSINESSOBJ_STATES c
            WHERE b.BUSINESSOBJ=a.CODE
                AND c.CODE=b.CURRENT_STATE
                AND a."TYPE" IN (0,1,2,3,4,5,6,22)
        GROUP BY a.DOCCODE) h,

    (SELECT a.CODE, b."NAME" as "CURRENT_STATE", a.STATEDATE, a.LASTNAME 
        FROM OMP_ADM.BUSINESSOBJ_PROMOTION a, OMP_ADM.BUSINESSOBJ_STATES b
            WHERE b.CODE=a.CURRENT_STATE) i

            
            WHERE b.CODE=a.ITEMTYPE
                AND c.CODE=a.MEASCODE
                AND d.OWNER=a.OWNER
                AND e.DOCCODE=a.UNVCODE
                AND e."TYPE"=a.ITEMTYPE
                AND g.UNVCODE=a.UNVCODE
                AND h.UNVCODE=a.UNVCODE
                AND h.CODE=i.CODE
                AND a.ITEMTYPE IN (0,1,2,3,4,5,6,22)''')

		#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
		db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
		#Количество видов с именем вида присваивается переменной after
		after=db.oracle.cursor.fetchall()[0][0]
		#Закрывается подключение к базе данных Oracle
		db.oracle.disconnect()
		#end of function suite
		return after-before

	def drop():
		'''Function drops the view'''
		#beginning of function suite
		#print(OraKobjToImport.drop.__doc__)
		
		name=OraKobjToImport.name
		#Выполняется подключение к базе данных
		db.oracle.connect()
		
		#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
		db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
		#Количество видов с именем вида присваивается переменной before
		before=db.oracle.cursor.fetchall()[0][0]
		if before!=0:
			# Выполняется запрос на уничтожение вида:
			db.oracle.cursor.execute('''DROP VIEW "OMP_ADM"."'''+name+'''"''')
		#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
		db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
		#Количество видов с именем вида присваивается переменной after
		after=db.oracle.cursor.fetchall()[0][0]
		#Закрывается подключение к базе данных
		db.oracle.disconnect()
		#end of function suite
		return before-after

#end of OraKobjToImport class suite



class PgKobj:
	"This class is a manipulator for konstrobj in postgre"
	#print (PgKobj.__doc__)
	#beginning of class suite	
	
	name='ei_so_omega_konstrobj'
	def create():
		'''Function creates the table'''
		#beginning of function suite
		#print(PgKobj.create.__doc__)
	
		name=PgKobj.name
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
		#Количество таблиц с именем таблицы присваивается переменной before
		before=count(name)[0][0]
		if before==0:
			#Подготавливается транзакция создания таблицы
			create=db.postgre.conn.execute('''CREATE TABLE '''+name+''' 
			(
			  unvcode integer NOT NULL, --Omega.konstrobj
			  revision integer NOT NULL, --Omega.konstrobj
			  itemtype integer NOT NULL, --Omega.konstrobj
			  itemtype_name character varying(40) NOT NULL, --Omega.ko_types.name 
			  sign character varying(100) NOT NULL, --Omega.konstrobj
			  name character varying(200), --Omega.konstrobj
			  notice character varying(100), --Omega.konstrobj
			  meascode integer NOT NULL, --Omega.konstrobj
			  measname character varying(40) NOT NULL, --Omega.measures.name 
			  supplytype integer NOT NULL, --Omega.konstrobj
			  format character varying(15), --Omega.konstrobj
			  owner integer NOT NULL, --Omega.konstrobj
			  owner_name character varying(100) NOT NULL, --Omega.owner_name
			  recdate timestamp NOT NULL, --Omega.konstrobj
			  prodcode integer NOT NULL, --Omega.konstrobj
			  omp_objects_code integer NOT NULL, -- Omega.omp_objects.code
			  first_promcode integer NOT NULL, -- Omega.businessobj_promotion.code
			  last_promcode integer NOT NULL, -- Omega.businessobj_promotion.code
			  current_state character varying(40), -- Omega.businessobj_states.name
			  statedate timestamp NOT NULL, -- Omega.businessobj_promotion.statedate
			  lastname character varying(40) NOT NULL, -- Omega.businessobj_promotion.lastname
			  CONSTRAINT '''+name+'''_pkey PRIMARY KEY (unvcode)
			 );
			ALTER TABLE '''+name+''' OWNER TO openerp;
			COMMENT ON TABLE '''+name+''' IS 'Таблица конструкторских элементов Omega';
			''')
		#Количество таблиц с именем таблицы присваивается переменной after
		after=count(name)[0][0]
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		return after-before

	def drop():
		'''Function drops the table'''
		#beginning of function suite
		#print(PgKobj.drop.__doc__)
		
		name=PgKobj.name
		#Выполняется подключение к базе данных postgres с заданными параметрами
		db.postgre.connect()
		#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
		#Количество таблиц с именем таблицы присваивается переменной before
		before=count(name)[0][0]
		if before!=0:
			#Удаляется таблица so_search_articles
			db.postgre.conn.execute('''DROP TABLE '''+name+''';''')
		#Количество таблиц с именем таблицы присваивается переменной after
		after=count(name)[0][0]
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		return after-before

	def delete(unvcode):
		'''Functions deletes row in the table'''
		#beginning of function suite
		#print(PgKobj.delete.__doc__)
		
		name=PgKobj.name
		#Подключение к базе данных postgre
		db.postgre.connect()
		#Подготавливается транзакция удаления строки в таблице
		delete=db.postgre.conn.prepare("DELETE FROM "+name+" WHERE unvcode=$1")
		#Выполняется транзакция
		result=delete(unvcode)
		#Закрывается подключение к базе данных postgre
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число удаленных строк
		return result[1]

	def insert(unvcode):
		'''Function inserts row in the table'''
		#beginning of function suite
		#print(PgKobj.insert.__doc__)
		
		destination=PgKobj.name
		source=OraKobjToImport.name
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Выполняется транзакция выборки строк в таблице
		select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination+" WHERE unvcode=$1")
		#Переменной before присваивается количество выбранных записей, которые будут удалены
		before=select(unvcode)[0][0]
		if before==0:
			#Подготавливается транзакция вставки записи в таблицу
			insert=db.postgre.conn.prepare("INSERT INTO "+destination+"(unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21)")
			#Выполняется подключение к базе данных oracle
			db.oracle.connect()
			#Выполняется запрос на выборку необходимых данных из вида в oracle:
			db.oracle.cursor.execute("SELECT * FROM "+source+" WHERE UNVCODE=:UNVCODE", UNVCODE=unvcode)
			#Из курсора все строки загружаются в таблицу
			insert.load_rows(db.oracle.cursor.fetchall())
			#Закрывается подключение к базе данных oracle
			db.oracle.disconnect()
		#Переменной after присваивается количество записей в таблице
		after=select(unvcode)[0][0]
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число вставленных строк
		return after-before

	def insert_many(rows):
		'''Function inserts rows in the table'''
		#beginning of function suite
		#print(PgKobj.insert_many.__doc__)
		
		name=PgKobj.name
		#Подключение к базе данных
		db.postgre.connect()
		rows_true=[]
		unvcodes=[]
		for row in rows:
			#Подготавливается транзакция подсчета строк в таблице
			count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name+" WHERE unvcode=$1")
			if count(row[0])[0][0]==0 and row[0] not in unvcodes:
				rows_true.append(row)
				unvcodes.append(row[0])
		#Подготавливается транзакция подсчета строк в таблице
		count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name)
		#Переменной before присваивается количество записей в таблице
		before=count()[0][0]
		#Подготавливается транзакция вставки записи в таблицу
		insert=db.postgre.conn.prepare("INSERT INTO "+name+"(unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21)")
		#Выполняется транзакция вставки строк в таблицу
		insert.load_rows(rows)
		#Переменной after присваивается количество записей в таблице
		after=count()[0][0]
		#Закрывается подключение к базе данных
		db.postgre.disconnect()
		#end of function suite
		return after-before


	def update(unvcode):
		'''Function updates row in the table'''
		#beginning of function suite
		#print(PgKobj.update.__doc__)
		destination=PgKobj.name
		source=OraKobjToImport.name

		#Выполняется подключение к базе данных oracle
		db.oracle.connect()
		#Выполняется запрос на выборку данных для unvcode=unvcode:
		db.oracle.cursor.execute("SELECT unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname FROM "+source+" WHERE unvcode=:UNVCODE", UNVCODE=unvcode)
		#Из курсора извлекаются данные в переменную result
		select=db.oracle.cursor.fetchall()
		#Закрывается подключение к базе данных oracle
		db.oracle.disconnect()
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		#Подготавливается транзакция обновления записи:
		update = db.postgre.conn.prepare("UPDATE "+destination+" SET unvcode=$1, revision=$2, itemtype=$3, itemtype_name=$4, sign=$5, name=$6, notice=$7, meascode=$8, measname=$9, supplytype=$10, format=$11, owner=$12, owner_name=$13, recdate=$14, prodcode=$15, omp_objects_code=$16, first_promcode=$17, last_promcode=$18, current_state=$19, statedate=$20, lastname=$21 WHERE unvcode="+str(unvcode))
		#Выполняется транзакция обновления записи:
		result=update(select[0][0], select[0][1], select[0][2], select[0][3], select[0][4], select[0][5], select[0][6], select[0][7], select[0][8], select[0][9], select[0][10], select[0][11], select[0][12], select[0][13], select[0][14], select[0][15], select[0][16], select[0][17], select[0][18], select[0][19], select[0][20])
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		#end of function suite
		#Функция возвращает число обновленных строк
		return result[1]
				
	def news():
		'''Function inserts new rows in the table'''
		#beginning of function suite
		#print(PgKobj.news.__doc__)
		
		#Объявляются переменные названия таблиц
		destination=PgKobj.name
		source=OraKobjToImport.name
		#imported=konstrobj.ora.table.imported.name
		
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()
		
		#Подготавливается транзакция выборки последнего значения unvcode в таблице
		last = db.postgre.conn.prepare("SELECT MAX(UNVCODE) FROM "+destination)
		#Результат выполнения транзакции записывается в переменную unvcode
		unvcode = last()[0][0]
		#Если таблица пуста, unvcode присваивается нулевое значение
		if unvcode==None:
			unvcode=0
		#Выполняется подключение к базе данных oracle
		db.oracle.connect()
		#Выполняется запрос на выборку новых записей:
		db.oracle.cursor.execute("SELECT unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname FROM "+source+" WHERE unvcode>:UNVCODE", UNVCODE=unvcode)
		
		#Выполняется транзакция выборки строк в таблице
		select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
		#Переменной before присваивается количество выбранных записей, которые будут удалены
		before=select()[0][0]
		
		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
					
		#Из курсора все строки загружаются в таблицу
		konstrobj.pg.table.konstrobj.insert_many(db.oracle.cursor.fetchall())
		
		#Закрывается подключение к базе данных oracle
		db.oracle.disconnect()
		
		#Выполняется подключение к базе данных postgres
		db.postgre.connect()

		#Выполняется транзакция выборки строк в таблице
		select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
		#Переменной before присваивается количество выбранных записей, которые будут удалены
		after=select()[0][0]

		#Закрывается подключение к базе данных postgres
		db.postgre.disconnect()
		
		#end of function suite
		#Функция возвращает количество добавленных записей
		return after-before

	def empty():
		'''Function empties the table'''
		#beginning of function suite
		#print(PgKobj.empty.__doc__)
					
					name=PgKobj.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается запрос на удаление всех записей из таблицы
					delete=db.postgre.conn.prepare("DELETE FROM "+name)
					#Выполняется запрос на удаление записей из таблицы
					result=delete()
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число удаленных строк
					return result[1]






#Вывод ошибок возвращается "в исходное положение"

#sys.stderr.close()
#sys.stderr = sys.__stderr__